package helper

//
//import (
//	"bytes"
//	"context"
//	"io/ioutil"
//	"net/http"
//	"time"
//
//	"go.uber.org/zap"
//)
//
//type httpC struct {
//	log     *zap.Logger
//	timeout time.Duration
//	hcOpts  []HTTPClientOption
//}
//
//func NewHTTPC(log *zap.Logger, opts ...HTTPClientOption) *httpC {
//	return &httpC{
//		log:     log,
//		timeout: 10 * time.Second,
//		hcOpts:  opts,
//	}
//}
//
//func (h *httpC) Request(method, url string, body []byte, opts ...HTTPRequestOption) (int, []byte, error) {
//	h.log.Info(
//		"HttpC Request begin",
//		zap.String("method", method),
//		zap.String("url", url),
//		zap.String("body", string(body)),
//	)
//	req, err := http.NewRequest(method, url, bytes.NewBuffer(body))
//	if err != nil {
//		h.log.Error("HttpC http.NewRequest error", zap.Error(err))
//		return 0, nil, err
//	}
//	// 设置http.request参数
//	for _, fun := range opts {
//		fun(req)
//	}
//
//	client := &http.Client{
//		Timeout: h.timeout,
//	}
//	// 设置http.client参数
//	for _, fun := range h.hcOpts {
//		fun(client)
//	}
//	// 设置超时
//	ctxTimeout, cancel := context.WithTimeout(context.Background(), client.Timeout)
//	defer cancel()
//	isTimeout := func() error {
//		select {
//		default:
//			return nil
//		case <-ctxTimeout.Done():
//			// 是否超时
//			return ctxTimeout.Err()
//		}
//	}
//	req = req.WithContext(ctxTimeout)
//	startReqTime := time.Now()
//	response, err := client.Do(req)
//	if err != nil {
//		h.log.Error("HttpC client.Do error", zap.Error(err))
//		if errTimeout := isTimeout(); errTimeout != nil {
//			// 通过 errors.Is(errTimeout, context.DeadlineExceeded)判断是否是超时错误
//			return 0, nil, errTimeout
//		}
//		return 0, nil, err
//	}
//	defer func() {
//		if err = response.Body.Close(); err != nil {
//			h.log.Error("HttpC response.Body.Close error", zap.Error(err))
//		}
//	}()
//	tcMs := time.Since(startReqTime).Milliseconds()
//	h.log.Info("HttpC client.Do success", zap.String("status", response.Status), zap.Reflect("tcMs", tcMs))
//	respBody, err := ioutil.ReadAll(response.Body)
//	if err != nil {
//		h.log.Error("HttpC ioutil.ReadAll error", zap.Error(err))
//		return 0, nil, err
//	}
//	if len(respBody) > 4096 {
//		h.log.Info(
//			"HttpC Request end",
//			zap.Int("StatusCode", response.StatusCode),
//			zap.String("Status", response.Status),
//		)
//	} else {
//		h.log.Info(
//			"HttpC Request end",
//			zap.Int("StatusCode", response.StatusCode),
//			zap.String("Status", response.Status),
//			zap.String("respBody", string(respBody)),
//		)
//	}
//
//	return response.StatusCode, respBody, nil
//}
//
//type HTTPClientOption func(c *http.Client)
//
//func WithTimeout(timeout time.Duration) HTTPClientOption {
//	return func(c *http.Client) {
//		c.Timeout = timeout
//	}
//}
//
//type HTTPRequestOption func(c *http.Request)
//
//func WithSetBasicAuth(username, password string) HTTPRequestOption {
//	return func(req *http.Request) {
//		req.SetBasicAuth(username, password)
//	}
//}
//
//func WithSetHeaders(header map[string]string) HTTPRequestOption {
//	return func(req *http.Request) {
//		for k, v := range header {
//			req.Header.Add(k, v)
//		}
//	}
//}
